package scalaLearning.scoptCommandParse

import com.typesafe.config.ConfigFactory
import org.apache.spark.sql.SparkSession
import scopt.OptionParser

/**
  * 本文件主要用于学习 scala 中配置文件之 config
  *
  * Typesafe的Config库，纯Java写成、零外部依赖、代码精简、功能灵活、API友好。
  * 支持Java properties、JSON、JSON超集格式HOCON以及环境变量。它也是Akka的配置管理库.
  *
  * <dependency>
  * <groupId>com.typesafe</groupId>
  * <artifactId>config</artifactId>
  * <version>1.2.1</version>
  * </dependency>
  *
  * 纯java实现，无任何依赖
  * 充分的测试
  * 支持: Java properties, JSON, and a human-friendly JSON superset
  * 可以合并各种格式的配置文件
  * 可以通过文件、urls、classpath加载配置
  * 支持多层嵌套的配置方式
  * 识别Java system properties, 如java -Dmyapp.foo.bar=10
  * 可以转换长短，大小等单位。如配置文件中timeout=10s,则可以转换成任意的毫秒或者
  * 类型转换，比如yes可以转换为boolean类型的true
  *
  * 默认加载classpath下的application.conf,application.json和application.properties文件。
  * 将  application.*   放在 resource 文件夹下即可
  * 通过ConfigFactory.load()加载。
  */
object scoptCommandParse extends App  {
  case class Params(conf: String = "application.conf") // 读取 application.conf 文件中的配置
  val parser = new OptionParser[Params]("SparkFilesArgs") {

    opt[String]('c', "conf")
        .text("config.resource for telematics")
        .action((x, c) => c.copy(conf = x))
    help("help").text("prints this usage text")
  }

  // 解析命令行参数
  parser.parse(args, Params()) match {
    case Some(params) => println(params)
    case _ => sys.exit(1)
  }

  // 本地模式运行,便于测试
  val spark = SparkSession.builder()
      .appName(this.getClass.getName)
      .master("local[3]")
      .getOrCreate()

  spark.sparkContext.setLogLevel("WARN")

  val df  = spark.read.csv("data/csv.txt")
  df.show()

  ConfigFactory.invalidateCaches() // 清理配置缓存


  lazy val config = ConfigFactory.load()
  println(config.origin())
  lazy val sparkConf = config.getConfig("kafka")
  lazy val brokerList = sparkConf.getString("broker.list")
  lazy val topic = sparkConf.getString("consumer.topic")
  println(brokerList, topic)
println(sparkConf)
  spark.stop()
}
